﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using WpfApp1.Models;

namespace WpfApp1.Servcies
{
    public class DeptService
    {
        public static List<Dept> _allDepts = List();

        // 非树形形式
        public static List<Dept> List()
        {
            var list = new List<Dept>();
            list.Add(new Dept(1, "市场", 0));
            list.Add(new Dept(2, "客服", 0));
            list.Add(new Dept(3, "研发", 0));
            list.Add(new Dept(4, "产品", 3));
            list.Add(new Dept(5, "开发", 3));
            list.Add(new Dept(6, "测试", 3));
            list.Add(new Dept(7, "运维", 3));
            return list;
        }

        // 树形形式（仅有部门表的数据）
        public static List<Dept> ListTree(int parentId = 0)
        {
            List<Dept> depts = _allDepts.FindAll(m => m.ParentId == parentId);

            foreach (var dept in depts)
            {                
                dept.SubDepts = ListTree(dept.Id);  // 递归
            }

            return depts;
        }

        // 树形形式（包含部门和用户）isMerge:{true:用户（转为部门类型）和同节点的部门放在同一个集合;false:用户和同节点的部门放在不同的集合}
        public static List<Dept> ListTreeWithUser(int parentId = 0, bool isMerge = true)
        {
            List<Dept> depts = _allDepts.FindAll(m => m.ParentId == parentId);

            foreach (var dept in depts)
            {                
                dept.SubDepts = ListTreeWithUser(dept.Id, isMerge); // 递归

                List<User> users = UserService.ListByDeptId(dept.Id);

                if (isMerge)
                {
                    // 把用户转为部门类型，和同节点的部门放在同一个集合中。ParentId = -1 表示是用户
                    foreach (var user in users)
                    {
                        dept.SubDepts.Add(new Dept(user.Id, user.Name, -1));
                    }
                }
                else
                {
                    // 用户单独放在一个集合中
                    dept.Users = users;
                }
            }

            return depts;
        }
    }
}
